package com.cino.demos.sourceCode.mybatisDemo;

import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * SQL会话默认实现
 */
public class DefaultSqlSession implements SqlSession {
    
    // SQL映射配置中心（模拟从XML/注解读取）
    private final Map<String, String> sqlMappings = new HashMap<>();
    
//    public DefaultSqlSession() {
//        // 初始化SQL映射配置（模拟）
//        sqlMappings.put("UserMapper.selectUserById", "SELECT * FROM users WHERE id = ?");
//        sqlMappings.put("UserMapper.insertUser", "INSERT INTO users(id, name, age) VALUES(?, ?, ?)");
//    }

    @SuppressWarnings("unchecked")
    @Override
    public <T> T getMapper(Class<T> mapperInterface) {
        // 动态代理核心：创建接口的代理实例
        return (T) Proxy.newProxyInstance(
            mapperInterface.getClassLoader(),
            new Class[]{mapperInterface},
            new MapperProxy(this)
        );
    }
    
    @Override
    public Object execute(String methodId, Object[] args) {
        // 1. 获取对应的SQL语句
        String sql = sqlMappings.get(methodId);
        if (sql == null) {
            throw new RuntimeException("未找到方法对应的SQL映射: " + methodId);
        }
        
        System.out.println("\n=== 动态代理触发 ===");
        System.out.println("接口方法: " + methodId);
        System.out.println("执行SQL: " + sql);
        System.out.println("参数: " + Arrays.toString(args));
        
        // 2. 根据SQL类型执行不同的操作（模拟）
        if (methodId.equals("UserMapper.selectUserById")) {
            // 模拟查询操作
            return new User((Integer)args[0], "动态代理用户", 25);
        } else if (methodId.equals("UserMapper.insertUser")) {
            // 模拟插入操作
            System.out.println("模拟插入用户成功");
            return 1; // 返回影响行数
        }
        
        throw new UnsupportedOperationException("未实现的操作: " + methodId);
    }
}